package leetcode.editor.cn;
//Java：移除元素
public class RemoveElement{
    public static void main(String[] args) {
        Solution solution = new RemoveElement().new Solution();
        // TO TEST
    }
    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 数组删除数据，就需要用到双指针，快慢指针进行数据迁移
     * 问题：1、为什么 fastIndex < nums.length而不是 fastIndex <= nums.length
     * 答：因为nums[nums.length] 不存在
     * 2、为什么nums[fastIndex] != val，不是nums[slowIndex] != val
     * 答：因为nums[fastIndex] != val是为了把它的值给slowIndex对应的值。如果等于的时候，
     * 慢指针记录这个值，快指针寻找下一个不等于val的值，移动到慢指针的位置
     * 3、为什么不是返回slowIndex-1
     * 答：因为要求返回的是新数组的长度，不是要找最后一个值的下标.slowIndex最后时刻值得是下标，但是最后+1的时候就变成了长度
     * 易错点：1、写不好的时候，容易把if写成while。
     * 当nums[fast] 和val不相等的时候，只需要把慢指针记录的值换为快指针对应的值即可，每交换一次，快慢指针都要向后移一位，不需要一直while循环
     * nums[slowIndex++] = nums[fastIndex];处理的情况有两种
     * 1、如果slowIndex和fastIndex重合，那就不进行值的交换。
     * 2、如果slowIndex和fastIndex不重合，就是要把fastIndex位置的数据前移，然后慢指针再前移一位
     */
    class Solution {
        public int removeElement(int[] nums, int val) {
            int slowIndex = 0;
            for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
                if (nums[fastIndex] != val) {
                    nums[slowIndex++] = nums[fastIndex];
                }
            }
            return slowIndex;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}